今天面试官问到一个“如何排除某个属性”,当时脑子一抽,听到排除就想到了 Exclude
事后问面试官才知道想要得知的答案是 Omit
,真是。。。
不过 Exclude
也的确能排除属性啊,虽然他是排除变体用的,但是也能排除属性,比如:
type A = {
x: number
y: number
z: number
}
type B = {
[P in Exclude<keyof B, 'x'>]: A[P]
}
这样写不就排除咯,恰好这也是 Omit
的实现,不知道这算不算狡辩,
#TS 内置类型工具实现原理
TS 所有内置的类型工具都是基于 extends
、infer
、keyof
关键字以及-?
语法实现的,比如 Exclude
便是基于 extends
实现的。
type Exclude<T, U> = T extends U ? never : T
泛形 T
是一个联合类型,例如 A | B | C
这样表示其有三个变体,分别是 A
、B
、C
。泛形对于联合类型会进行传入每个变体然后重新收集,当返回 never
则被遗弃,例如:
type A = 'a' | 'b' | 'c'
type M = {
'a': 'aa',
'b': never,
'c': 'cc'
}
type K<T> = T extends keyof M ? M[T] : never;
type Result = K<A> // 'aa' | 'cc'
而 Exclude
做的便是如果 T 和 U 存在相似则返回 never 排除,否则返回变体本身,这样就排除了某个变体。
可惜咯,不过也不清楚为啥感觉迷迷糊糊的,难道是昨天一点才睡的缘故,也有可能是自己学艺不精啊,唉,不知道今天有面试,只能可惜了